package com.basker.pisces.orm.parser;

import java.util.List;

import com.basker.pisces.core.datasource.DbInfo;
import com.basker.pisces.orm.data.meta.DataSetMeta;
import com.basker.pisces.orm.data.meta.FieldMeta;
import com.basker.pisces.orm.data.meta.IndexMeta;
import com.basker.pisces.orm.data.meta.TableMeta;
import com.basker.pisces.orm.session.ISqlSession;
import com.basker.pisces.orm.session.WhereCondition;
import com.basker.pisces.orm.statement.BatchWriteStatement;
import com.basker.pisces.orm.statement.InsertCommand;
import com.basker.pisces.orm.statement.SelectStatement;
import com.basker.pisces.orm.statement.UpdateCommand;

/**
 * Sql语句解析器，不同的数据库对应不同的解析器
 *
 * @author hangwen
 */
public interface ISqlParser {

    /**
     * 获取添加字段sql
     *
     * @param tableMeta
     * @param fieldMeta
     * @return
     */
    String getAddFieldSql(TableMeta tableMeta, FieldMeta fieldMeta);

    /**
     * 获取创建索引的sql
     *
     * @param tableMeta
     * @param indexMeta
     * @return
     */
    String getCreateIndexSql(TableMeta tableMeta, IndexMeta indexMeta);

    /**
     * 获取创建schema(数据库)的sql
     *
     * @param dbInfo
     * @param sqlSession 通过sqlSession可以从当前库获取更多的信息
     * @return
     */
    String getCreateSchemaSql(DbInfo dbInfo, ISqlSession sqlSession);

    /**
     * 获取创建表的sql语句
     *
     * @param tableMeta
     * @return
     */
    String getCreateTableSql(TableMeta tableMeta);

    /**
     * 获取数据表的删除语句
     *
     * @param tableMeta
     * @param deletePkValues
     * @return
     */
    BatchWriteStatement getDeleteStatement(TableMeta tableMeta, List<Object> deletePkValues);

    /**
     * 获取对象的删除语句集合，每一个语句对应一张表的删除语句
     *
     * @param dataSetMeta
     * @param deletePkValues
     * @return
     */
    List<BatchWriteStatement> getDeleteStatements(DataSetMeta dataSetMeta, List<Object> deletePkValues);

    /**
     * 获取对象的新增语句集合，每一个语句对应一张表的新增语句
     *
     * @param tableMeta
     * @param insertCommands
     * @return
     */
    List<BatchWriteStatement> getInsertStatements(TableMeta tableMeta, List<InsertCommand> insertCommands);

    /**
     * 获取修改字段sql
     *
     * @param tableMeta
     * @param fieldMeta
     * @return
     */
    String getModifyFieldSql(TableMeta tableMeta, FieldMeta fieldMeta);

    /**
     * 根据数据表查询数据，返回一个DataTable
     *
     * @param dataSetMeta
     * @param tableMeta
     * @param condition
     * @return
     */
    SelectStatement getSelectStatement(DataSetMeta dataSetMeta, TableMeta tableMeta, WhereCondition condition);

    /**
     * 获取同步字段的SQL
     *
     * @param tableMeta
     * @param fieldMeta
     * @return
     */
    String getSynFieldSql(TableMeta tableMeta, FieldMeta fieldMeta);

    /**
     * 获取同步字段的SQL
     *
     * @param tableMeta
     * @param indexMeta
     * @return
     */
    String getSynIndexSql(TableMeta tableMeta, IndexMeta indexMeta);

    /**
     * 获取指定表列信息。
     * <p>
     * 由于不同的数据库的查询元数据的语句和返回值可能都不相同，因此语句执行和结果处理全部由方法内部处理，
     * 只需返回给外部{@link DBColumnInfo}集合即可。
     *
     * @param tableMeta
     * @param sqlSession 用于执行sql语句和处理返回值
     * @return
     */
    List<DBColumnInfo> getTableColumns(TableMeta tableMeta, ISqlSession sqlSession);

    /**
     * 获取指定表的索引信息
     * <p>
     * 由于不同的数据库的查询元数据的语句和返回值可能都不相同，因此语句执行和结果处理全部由方法内部处理，
     * 只需返回给外部{@link DBIndexInfo}集合即可。
     *
     * @param tableMeta
     * @param sqlSession
     * @return
     */
    List<DBIndexInfo> getTableIndexes(TableMeta tableMeta, ISqlSession sqlSession);

    /**
     * 获取对象的更新语句集合，每一个语句对应一张表的更新语句
     *
     * @param tableMeta
     * @param deletePkValues
     * @return
     */
    List<BatchWriteStatement> getUpdateStatements(TableMeta tableMeta, List<UpdateCommand> updateCommands);

    /**
     * 返回originalSql的分页查询sql
     *
     * @param originalSql
     * @param pageIndex
     * @param pageSize
     * @return
     */
    String resolvePageSql(String originalSql, int pageIndex, int pageSize);

}
